package com.cutebaby.admin.com.autowired;

import org.junit.Test;

import java.util.stream.Stream;

/**
 * @author: xialegemo
 * @description: 使用注解来手写实现注入
 * @date： 2020/10/20 23:51
 **/
public class MyTest2 {
    /*
    * 手动实现了一个@Autowired注解以后，尝试是否能通过该注解注入属性值
    * url：https://www.bilibili.com/video/BV1jz4y1f7qd?p=2
    * */

    @Test
    public void test(){
        UserController userController = new UserController();
        Class<? extends UserController> clazz = userController.getClass();
        // 实际上这里不手动new对象，也可以完成他的属性获取
//        UserService userService = new UserService();
//        System.out.println(userService);
        //获取所有的属性值
        Stream.of(clazz.getDeclaredFields()).forEach(field -> {
            // name值也不需要了
//            String name = field.getName();
            Autowired annotation = field.getAnnotation(Autowired.class);
            if (annotation != null) {
                field.setAccessible(true);
                // 获取属性的类型
                Class<?> type = field.getType();
                try {
                    Object o = type.newInstance();
                    field.set(userController, o);
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }

        });
        // 注意，以上代码并没有拼接方法名，现在打印内存地址，如果依然能取到，说明使用注解方式完成了注入
        System.out.println(userController.getUserService());

    }
}
